package edu.mju.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 * 必须实现 InvocationHandler()接口
 */
public class JdkDynamicProxy implements InvocationHandler{

	//真实对象
	private Object realObject = null;


	/**
	 *  建立代理对象和真实对象的代理关系
	 * @param realObject 真实对象
	 * @return 代理对象
	 */
	public Object proxyRelation(Object realObject) {
		this.realObject = realObject;
		//newProxyInstance(类加载器, 生成代理对象挂在该接口下, 实现方法逻辑的代理类);
		return Proxy.newProxyInstance(realObject.getClass().getClassLoader(), 
				realObject.getClass().getInterfaces(), 
				this);
	}


	/**
	 *  实现代理逻辑方法
	 * @param proxy 代理对象
	 * @param method 调用的方法
	 * @param args 方法的参数
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("---------------------进入代理invoke方法()---------------------");
		System.out.println("-------------------------调用真实对象方法之前------------------------");
		Object object = method.invoke(realObject, args);

		System.out.println("------------------------调用真实对象方法之后------------------------");
		return object;
	}
	
}
